package design.pattern.proxy.jdk$proxy;

import java.lang.reflect.Proxy;

/**
 * 代理工厂，用以获取代理类
 * 注释没写太多，因为JDK动态代理是老朋友了
 *
 * @author AtoVio, Winter Yuan
 */
public class ProxyFactory {

    // 声明目标对象
    private final TicketsSelling target = new TrainStation();

    // 因为代理类和目标类实现了同样的接口，所以可以返回二者共同的接口类型对象
    public TicketsSelling getProxyObject() {
        // 利用Proxy类的静态方法newProxyInstance来动态生成代理类
        return (TicketsSelling) Proxy.newProxyInstance(
                target.getClass().getClassLoader(), // 目标类的类加载器
                target.getClass().getInterfaces(), // 目标类实现的接口
                ((proxy, method, args) -> { // 需要添加的代理功能
                    System.out.println("代理方法执行了");
                    // 调用目标对象的目标方法
                    // 方法四要素：哪个对象，哪个方法，传递什么参数，返回什么值
                    return method.invoke(target, args);
                }));
    }
}
